#define  CONFIG_GLOBALS 
#include "hal.h"
#include "mid_bus.h"
#include "driver.h"
#include "mid_lcd.h"
#include "mid_timer.h"
#include "mid_adc.h"
#include "mid_beep.h"
#include "mid_power.h"
#include "mid_key.h"
#include "mid_uart.h"
#include "app_lcd.h"
#include "app_power.h"
#include "app_bus.h"
#include "app_timer_irf.h"
#include "app_key.h"
#include "app.h"

extern  strUsart   sUart0;
extern  strkey     skey;
const uint8 OperateA[2]={OperateWrAddr, OperateWrID};

/**
 * @brief  主函数，程序的入口点
 * 
 * 该函数负责初始化硬件和软件，设置用户界面数组，然后进入一个无限循环，
 * 根据不同的状态执行码间隔处理或发码操作。
 * 
 * @return int32_t 程序退出状态，通常为0表示正常退出
 */
int32_t main(void)
{
    // 初始化系统硬件组件
    HardInit();
    // 初始化串口和按键相关的数据结构
    SoftInit();
	//界面UI数组初始化
	UI_Init();

    // 进入无限循环，持续处理任务
    while(1)
    {
        // 检查码标志是否不等于0xaa，表示处于码间隔状态
        if(code_flg != 0xaa)
        {
            // 设置码标志为0xaa，表示进入码间隔处理
            code_flg = 0xaa;
            // 设置任务延时为30
            TASK_Dly = 30;
            // 处理返回码
            process_ret(code_type);
            // 处理状态
            process_sta();
            // 在任务延时期间执行以下操作
            while(TASK_Dly)
            {
                // 发送UART0数据
                mid_UART0_Send();
                // 处理UART应用;
                uart_app();
                // 更新用户界面
                UI_PRO();
            }
            // 执行码间隔函数
            interval_fun();
            // 设置发码使能标志为0xaa
            sendcode_EN =0xaa;
        }
        else
        {
            // 执行发码函数
            CodesSnding_fun();
        }
    }
}


/**
 * @brief  UI界面初始化
 * 
 * 该函数用于初始化系统的硬件组件，包括时钟、电源、定时器、总线、LCD、蜂鸣器、按键、ADC等。
 * 初始化过程中会关闭中断，完成初始化后再打开中断。同时，在初始化完成后，蜂鸣器会响一声表示硬件初始化成功。
 */
void UI_Init(void)
{
    UINUM = 0;
 // 初始化当前显示的用户界面指针为NULL
    pUI_DIS = (void*)0;
    // 设置用户界面数组的第零个元素为版本信息界面
    pUIA[0] = UI_Ver;
    // 设置用户界面数组的第一个元素为测试模式界面
    pUIA[1] = UI_TestMode;
    // 设置用户界面数组的第二个元素为主地址读、写界面
    pUIA[2] = UI_mainAddrWR;
    // 设置用户界面数组的第三个元素为红外光环境值读、写界面	
	pUIA[3] = UI_WRIR_Val;
    // 设置用户界面数组的第个四元素为蓝光环境值读、写界面	
	pUIA[4] = UI_WRBL_Val;
    // 设置用户界面数组的第五个元素为红外光AD值读取界面
    pUIA[5] = UI_ReadAN1;
    // 设置用户界面数组的第六个元素为蓝光AD值读取界面
    pUIA[6] = UI_ReadAN2;
    // 设置用户界面数组的第七个元素为红外光报警阈值读写界面
    pUIA[7] = UI_WRIR_VPT1;
    // 设置用户界面数组的第八个元素为红外光报警阈值读写界面
    pUIA[8] = UI_WRIR_VPT2;
    // 设置用户界面数组的第九个元素为蓝光报警阈值读写界面
    pUIA[9] = UI_WRBL_VPT1;
    // 设置用户界面数组的第十个元素为蓝光报警阈值读写界面
    pUIA[10] = UI_WRBL_VPT2;
    // 设置用户界面数组的第十一个元素为类型界面
    pUIA[11] = UI_Type;
    // 设置用户界面数组的第十二个元素为读写声响等级界面
    pUIA[12] = UI_SgVoice;
    // 设置用户界面数组的第十三个元素为读写模块充电等级界面
    pUIA[13] = UI_ModuleCharge;
    // 设置用户界面数组的第十四个元素为读取版本界面
    pUIA[14] = UI_ReadVer;
    // 设置用户界面数组的第十五个元素为读写唯一ID界面
    pUIA[15] = UI_WR_ID;
    // 设置用户界面数组的第十七个元素为读取硬件版本界面
    pUIA[16] = UI_ReadHard_Ver;
    // 设置用户界面数组的第十八个元素为读取基值界面
    pUIA[17] = UI_ReadBaseVal;
    // 设置用户界面数组的第十九个元素为线路检查无故障界面
    pUIA[18] = UI_CheckLineNF;
    // 设置用户界面数组的第二十个元素为输出短路检查电压界面
    pUIA[19] = UI_OutShortCheckVoltage;

}





/**
 * @brief  硬件初始化函数
 * 
 * 该函数用于初始化系统的硬件组件，包括时钟、电源、定时器、总线、LCD、蜂鸣器、按键、ADC等。
 * 初始化过程中会关闭中断，完成初始化后再打开中断。同时，在初始化完成后，蜂鸣器会响一声表示硬件初始化成功。
 */
void HardInit(void)
{
    // 使能RCH时钟，设置频率为8MHz
    hal_clock_eanble_rch(SysctrlRchFreq8MHz);
    // 关闭全局中断
    di();                         			
    // 进行时钟切换
    clock_init();                 			
    // 延时1000ms，确保时钟稳定
    delay_ms(1000);							
    // 初始化电源控制端口
    mid_PowerPort();             			
    // 初始化红外管用定时器
    mid_Timer1Init();             			
    // 初始化总线用的端口
    mid_BusPort();                			
    // 初始化液晶屏显示
    mid_LcdInit();                			
    // 初始化蜂鸣器端口
    mid_BeepPort();               			
    // 初始化行列式键盘
    mid_KeyInit();                			
    // 初始化AD采集端口
    mid_AdcPortInit();           			
    // 初始化T0定时器
    mid_Timer0Init();						
    // 初始化T2定时器
    mid_Timer2Init();						
    // 初始化T3定时器，设置初始值为15625
    mid_Timer3Init(15625);					
    // 初始化PCA的GPIO
    mid_Pca_GpioInit();						
    // 初始化PCA的M4模式（具体功能需根据代码实现）
    mid_Pca_M4Init();						
    // 打开全局中断
    ei();                         			
    // 打开蜂鸣器
    BEEP_ON();                    			
    // 延时100ms
    delay_ms(100);
    // 关闭蜂鸣器
    BEEP_OFF();
}

/**
 * @brief  更新用户界面的函数
 * 
 * 该函数检查当前显示的用户界面是否与所需的用户界面不同，如果不同则标记界面需要刷新和初始化，
 * 然后更新当前显示的用户界面指针，并调用该界面的显示函数。
 */
void UI_PRO(void)
{
    // 检查当前显示的用户界面是否与所需的用户界面不同
    if(pUI_DIS != pUIA[UINUM])
    {
        // 如果不同，标记界面需要刷新
        strLcdD.UIfresh = 1;
        // 标记界面需要初始化
        strLcdD.UIinit = 1;
        // 更新当前显示的用户界面指针
        pUI_DIS = pUIA[UINUM];
    }
    // 调用当前显示的用户界面的显示函数
    pUI_DIS();
    
}
/**
 * @brief  软件初始化函数
 * 
 * 该函数用于对软件系统进行初始化操作，包括初始化串口和按键相关的数据结构。
 */
void SoftInit(void)
{
    // 将串口0的结构体变量sUart0清零，确保初始状态为零值
    DDL_ZERO_STRUCT(sUart0);
    // 初始化串口0，配置串口的工作模式、波特率等参数
    Mid_Uart0Init();
    // 将按键结构体变量skey清零，确保按键状态初始化为零值
    DDL_ZERO_STRUCT(skey);
}
